package persistencia;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import negocio.Area;
import negocio.Curso;
import negocio.Usuario;
import negocio.Supervisor;

public class UsuarioDAO 
{
	private static UsuarioDAO instancia;
	private final Connection c;
	
	
	
	private UsuarioDAO()
	{
		c = BDManager.getInstance().getConexion();
	}

	public static UsuarioDAO getInstance()
	{
		if(instancia ==null)
		{
			instancia = new UsuarioDAO();
		}
		return instancia;
	}
	
	
	//TODO: para proximos sprints se usa
	public void guardar(Usuario usu)
	{
		String query = "INSERT INTO usuario( dni, nombre, apellido, telefono, mail, nickname, contrasenia, perfil, estado) VALUES"+ " ('" + usu.getDni() + "','" + usu.getNombre() +"','" + usu.getApellido() + "','" + usu.getTelefono() +"','"+ usu.getMail()+ "','" + usu.getNickname() + "','" + usu.getContrasenia()+ "','" + usu.getPerfil()+ "','" + usu.getEstado()+ "')";
		
		try {
			Statement s = c.createStatement();
			s.execute(query);
			s.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}

	}
	
	//TODO: se cambia datos de usuario, pero la contrasenia se mantiene igual
	
//	BUG, agregar al set
	public void modifyUser(String dni, int tel, String mail, String nickname, String perfil, String estado)
	{
		String query = String.format(
			      "UPDATE usuario SET telefono=%d, mail='%s', nickname='%s', perfil='%s', estado='%s' WHERE dni='%s';",
			      tel, mail,nickname, perfil, estado, dni
			    );
				try {
					Statement s;
					s = c.createStatement();
					s.executeUpdate(query);
				    s.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}	    
	}
	
	
//	para validaciones en capa gui	
	public Usuario getUsuario(String dni)
	{
		String query = "SELECT * FROM usuario WHERE dni='"+dni+"'";
		Statement s;
		ResultSet rs;
		Usuario res = null;
		try{
			s = c.createStatement();
			rs = s.executeQuery(query);
			if(rs.next())
			res = new Usuario(rs.getString("dni"), rs.getString("nombre"), rs.getString("apellido"), rs.getInt("telefono"), rs.getString("mail"),rs.getString("nickname"), rs.getString("contrasenia"),rs.getString("perfil"));
			s.close();			
		}
		catch(SQLException e)
		{
			e.printStackTrace();
		}
		return res;
	}
	
//	para validaciones en capa gui
	public Usuario getUsuarioByNickname(String nick)
	{
		String query = "SELECT * FROM usuario WHERE nickname='"+nick+"'";
		Statement s;
		ResultSet rs;
		Usuario res = null;
		try{
			s = c.createStatement();
			rs = s.executeQuery(query);
			if(rs.next())
			res = new Usuario(rs.getString("dni"), rs.getString("nombre"), rs.getString("apellido"), rs.getInt("telefono"), rs.getString("mail"),rs.getString("nickname"), rs.getString("contrasenia"),rs.getString("perfil"));
			s.close();			
		}
		catch(SQLException e)
		{
			e.printStackTrace();
		}
		return res;
	}	
	
	
	
	
//TODO BUG: agregado "and estado<>'inactivo';  ", probar que funciona todo luego de esto (estado: pendiente)
	public ArrayList<Usuario> getAll()
	{
		String query = "select * from usuario where nickname<>'Sistema' and estado<>'inactivo'";
		Statement s;
		ResultSet rs;
		ArrayList<Usuario> res = new ArrayList<Usuario>();
		try {
			s = c.createStatement();
			rs = s.executeQuery(query);
			while(rs.next())
			{
				if(rs.getString("nombre")!="Sistema")
				res.add(new Usuario(rs.getString("dni"), rs.getString("nombre"), rs.getString("apellido"), rs.getInt("telefono"), rs.getString("mail"),rs.getString("nickname"), rs.getString("contrasenia"), rs.getString("perfil")));
			}
			s.close();
		} catch (SQLException e) 
		{
			e.printStackTrace();
		}
		return res;
	}

	
	
	
	  //SE devuelve Objeto, para luego comparar si permanece null la variable o no cuando se invoca este metodo.
	  public Usuario buscarUser(String username, String password) throws SQLException {
	    String query = String.format(
	      "select * from usuario where nickname = '%s' and contrasenia = '%s' and estado<>'inactivo';",
	      username, password
	    );
	    Statement s = c.createStatement();
	    ResultSet rs = s.executeQuery(query);
	   
	    Usuario dto = null;
	    
	    if (rs.next()) {
	    	
	      dto = new Usuario(rs.getString("dni"), rs.getString("nombre"), rs.getString("apellido"), rs.getInt("telefono"), rs.getString("mail"),rs.getString("nickname"), rs.getString("contrasenia"), rs.getString("perfil"));
	    }
	    s.close();
	    return dto; //si no existe devuelve null
	  }

	  
//TODO BUG: agregar and estado<>'inactivo';
	public ArrayList<Usuario> getInstructores() {
		String query = "SELECT * FROM usuario where perfil='Instructor'";
		Statement s;
		ResultSet rs;
		ArrayList<Usuario> res = new ArrayList<Usuario>();
		try {
			s = c.createStatement();
			rs = s.executeQuery(query);
			while(rs.next())
			{
				res.add(new Usuario(rs.getString("dni"), rs.getString("nombre"), rs.getString("apellido"), rs.getInt("telefono"), rs.getString("mail"),rs.getString("nickname"), rs.getString("contrasenia"), rs.getString("perfil")));
			}
			s.close();
		} catch (SQLException e) 
		{
			e.printStackTrace();
		}
		return res;
	}

//TODO BUG: agregar " and estado<>'inactivo'; "
	public ArrayList<Usuario> getAdministrativosSupervisores() {
		String query = "SELECT * FROM usuario where perfil='supervisor' or perfil='administrativo'";
		Statement s;
		ResultSet rs;
		ArrayList<Usuario> res = new ArrayList<Usuario>();
		try {
			s = c.createStatement();
			rs = s.executeQuery(query);
			while(rs.next())
			{
				res.add(new Usuario(rs.getString("dni"), rs.getString("nombre"), rs.getString("apellido"), rs.getInt("telefono"), rs.getString("mail"),rs.getString("nickname"), rs.getString("contrasenia"), rs.getString("perfil")));
			}
			s.close();
		} catch (SQLException e) 
		{
			e.printStackTrace();
		}
		return res;
	}
	
	 //usado para el cambio de conrasenia en capa gui, mantiene al mismo usuario pero le cambia su contrasenia en la BD	
	public void updateContraseniaUser(Usuario dniUser, String contraseniaNueva) throws SQLException {
	    String query = String.format(
	      "update usuario set contrasenia = '%s' where dni = '%s' and estado<>'inactivo';",
	      contraseniaNueva, dniUser.getDni()
	    );
	    Statement s = c.createStatement();
	    s.executeUpdate(query);
	    s.close();
	  }
	
//TODO BUG: agregar " and estado<>'inactivo'; "	
	public ArrayList<Usuario> getSupervisores()
	{
		String query = "SELECT * FROM usuario where perfil='supervisor'";
		Statement s;
		ResultSet rs;
		ArrayList<Usuario> res = new ArrayList<Usuario>();
		try {
			s = c.createStatement();
			rs = s.executeQuery(query);
			while(rs.next())
			{
				res.add(new Usuario(rs.getString("dni"), rs.getString("nombre"), rs.getString("apellido"), rs.getInt("telefono"), rs.getString("mail"),rs.getString("nickname"), rs.getString("contrasenia"), rs.getString("perfil")));
			}
			s.close();
		} catch (SQLException e) 
		{
			e.printStackTrace();
		}
		return res;
	}

	
}
